package cn.tedu.knows.portal.controller;


import cn.tedu.knows.portal.exception.ServiceException;
import cn.tedu.knows.portal.model.Question;
import cn.tedu.knows.portal.service.IQuestionService;
import cn.tedu.knows.portal.vo.QuestionVo;
import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.core.parameters.P;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * <p>
 * 前端控制器
 * </p>
 *
 * @author tedu.cn
 * @since 2021-07-23
 */
@RestController
@RequestMapping("/v1/questions")
@Slf4j
public class QuestionController {

    @Autowired
    private IQuestionService questionService;

    //  /v1/questions/my
    @GetMapping("/my")
    //@AuthenticationPrincipal注解的含义是获得当前登录用户的详情
    // 注解后面直接跟UserDetails类型的参数,即可
    public PageInfo<Question> getMyQuestions(
            @AuthenticationPrincipal UserDetails user,
            Integer pageNum) {
        if (pageNum == null) {
            pageNum = 1;
        }
        Integer pageSize = 8;
        PageInfo<Question> pageInfo = questionService
                .getMyQuestion(user.getUsername(),
                        pageNum, pageSize);
        return pageInfo;
    }

    // 学生发布问题的控制器方法
    // 访问这个方法的路径是localhost:8080/v1/questions
    @PostMapping("")
    public String createQuestion(
            @Validated QuestionVo questionVo,
            BindingResult result,
            @AuthenticationPrincipal UserDetails user) {
        log.debug("接收到表单信息:{}", questionVo);
        if (result.hasErrors()) {
            String msg = result.getFieldError().getDefaultMessage();
            return msg;
        }
        //调用业务逻辑层
        questionService.saveQuestion(
                questionVo, user.getUsername());
        return "ok";
    }

    // 显示讲师首页任务列表的控制器方法
    @GetMapping("/teacher")
    // 讲师的任务列表学生不能查询,添加一个验证
    // 必须拥有讲师身份才能运行这个方法
    @PreAuthorize("hasRole('ROLE_TEACHER')")
    public PageInfo<Question> teachers(
            @AuthenticationPrincipal UserDetails user,
            Integer pageNum) {
        if (pageNum == null)
            pageNum = 1;
        Integer pageSize = 8;
        PageInfo<Question> pageInfo = questionService
                .getTeacherQuestions(
                        user.getUsername(), pageNum, pageSize);
        return pageInfo;
    }

    //   /{id}的含义是匹配任何在/v1/questions/之后的内容
    //   例如/v1/questions/149
    //   那么/{id}就能匹配149
    //   要想在控制器方法中获得路径中匹配的内容或数据
    //   在方法的参数中 使用@PathVariable注解标记要获得该数据的变量
    //   而且这个变量的名称必须和/{id}中的名字一样
    @GetMapping("/{id}")
    public Question getQuestion(
            @PathVariable Integer id){
        if(id==null){
            throw new ServiceException("问题id无效");
        }
        Question question=questionService.getQuestionById(id);
        return question;
    }
}
